#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <string>
#include <thread>
#include <cstring>

int flag=100;

class Task
{
public:
    Task(int a,int b)
    :_a(a),_b(b)
    {}

    ~Task()
    {

    }

    int Execute()
    {
        return  _a+_b;
    }
private:
    int _a;
    int _b;
};

class Result
{
public:
    Result(int result)
    :_result(result)
    {

    }

    ~Result()
    {

    }

    int GetResult()
    {
        return _result;
    }
private:
    int _result;
};

std::string FormatId(pthread_t&& tid)
{
    char buf[64];
    snprintf(buf,sizeof(buf),"0x%lx",tid);
    return buf;
}

void showtid(pthread_t& tid)
{
    printf("tid: 0x%lx\n",tid);
}

void* routine(void* args)
{
    pthread_detach(pthread_self());
    int cnt=5;
    while(cnt--)
    {
        std::cout<<"新线程"<<std::endl;
        sleep(1);
    }
    return nullptr;
    

    // Task* t=static_cast<Task*>(args);
    // sleep(100);
    // Result* r=new Result(t->Execute());
    // sleep(1);
    // return (void*)r;


    // std::string name=(const char*)args;
    // int cnt=5;
    // while(cnt--)
    // {
    //     std::cout<<"我是新线程，name： "<<name<<" pid: "<<getpid()<<"tid :"<<FormatId(pthread_self())<<std::endl;
    //     flag++;
    //     sleep(1);
    // }

    // // return nullptr;
    // return (void*)100;//可以暂时作为线程退出的退出码
}

int main()
{
    Task* t=new Task(10,20);

    pthread_t tid;

    pthread_create(&tid,nullptr,routine,(void*)t);

    // pthread_detach(tid);
    // std::cout<<"新线程被分离"<<std::endl;

    int cnt=5;
    while(cnt--)
    {
        std::cout<<"main线程"<<std::endl;
        sleep(1);
    }

    int n=pthread_join(tid,nullptr);
    if(n!=0)
    {
        std::cout<<"join error"<<strerror(n)<<std::endl;
    }
    else 
    {
        std::cout<<"join success"<<std::endl;
    }

    // sleep(3);
    // pthread_cancel(tid);
    // std::cout<<"新线程被取消"<<std::endl;

    // void* ret=nullptr;
    // pthread_join(tid,&ret);
    // std::cout<<"新线程结束，结果： "<<(long long int)ret<<std::endl;

    // Result* ret=nullptr;
    // pthread_join(tid,(void**)&ret);

    // std::cout<<"ret is : "<<ret->GetResult()<<std::endl;

    // delete t;
    // delete ret;


    // pthread_create(&tid,nullptr,routine,(void*)"thread-1");

    // showtid(tid);

    // int cnt=5;
    // while(cnt--)
    // {
    //     std::cout<<"我是主线程,pid: "<<getpid()<<" tid : "<<FormatId(pthread_self())<<" flag: "<<flag<<std::endl;
    //     sleep(1);
    // }

    // void* ret=nullptr;
    // // pthread_join(tid,nullptr);
    // pthread_join(tid,&ret);
    // //join不需要处理异常，异常信号是进程要处理的话题，join都是基于线程健康跑完的情况

    // std::cout<<"ret is : "<<(long long int)ret<<std::endl;


    return 0;
}

//C++11的多线程，封装了pthread库。保证语言的跨平台可移植性
// void hello()
// {
//     std::cout<<"hello world"<<std::endl;
//     sleep(1);
// }

// int main()
// {
//     std::thread t(hello); 

//     std::cout<<"main thread"<<std::endl;
//     sleep(1);

//     t.join();

//     return 0;
// }